<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

<script>
const { log } = console;
// 1— Array.from ;    2- 对象的展开运算符

// 1. set
  // Array.from -> 静态方法； 作用：将“伪数组转成真数组”
      // 大部分情况下与 [...伪数组] 一样；
        // 区别：Array.from({0: 'a', 1: 'b', length: 2})  -> ['a', 'b']
            // [...{0: 'a', 1: 'b', length: 2}]  会报错，因为 对象没有 [Symbol.iterator]


// 对象可以使用 ... ， 在  对象中， 才能使用 ... 展开运算符
/* 
  const obj = {
    name: 'aaa',
    age: 333
  };

  log({
    ...obj,
    name: 'xxx'
  });

  log([...obj]);  // 会报错！因为 对象 key 的存储，本质就不是以  顺序的形式存储。
*/


// -------------------------

// 数据 基础数据类型的去重
const arr = [1, 2, 3, 4, 1, 2, 3, 4, 'a', 'a'];
/* 1. set 去重 
  const s1 = [...new Set(arr)] // 只要实例对象中有 [Symbol.iterator] 这个属性，就可以用 ...运算符 和 for of
  const s2 = Array.from(new Set(arr)); 

  function add() {
    console.log([...arguments], Array.from(arguments));
  }
*/

/* 2. 哈希去重：利用 对象 key 唯一性的 原理
  const result = {};
  arr.forEach(item => result[item] = '');
  console.log(Object.keys(result));
*/



// 复杂数据类型去重
const students = [
  { name: '张三', age: 30 },
  { name: '张4', age: 31 },
  { name: '张5', age: 32 },
  { name: '张四', age: 30 },
  { name: '张三', age: 30 }
];
const result = students.map(d => d.age);
log(Array.from(new Set(result)));


</script>
